﻿using System.Text;

namespace Sgr.Exceptions
{
    /// <summary>
    /// 领域异常处理器
    /// </summary>
    public class DomainExceptionHandler : IExceptionHandler
    {
        /// <summary>
        /// 尝试将领域异常翻译成可读的消息
        /// </summary>
        /// <param name="exception">要处理的异常</param>
        /// <param name="message">翻译后的消息</param>
        /// <returns>如果能够处理该异常则返回true，否则返回false</returns>
        public bool TryTranslate(Exception exception, ref string message)
        {
            if (exception is DomainException domainEx)
            {
                var sb = new StringBuilder();

                // 添加错误类型前缀
                sb.Append(GetErrorTypePrefix(domainEx.ErrorType));

                // 添加原始错误消息
                if (!string.IsNullOrEmpty(domainEx.Message))
                {
                    sb.Append(" ");
                    sb.Append(domainEx.Message);
                }

                // 添加错误代码（如果有）
                if (!string.IsNullOrEmpty(domainEx.ErrorCode))
                {
                    sb.Append($" [错误代码: {domainEx.ErrorCode}]");
                }

                //// 处理附加数据（如果有）
                //if (domainEx.AdditionalData != null)
                //{
                //}

                // 处理内部异常（如果有）
                if (domainEx.InnerException != null)
                {
                    sb.AppendLine();
                    sb.Append($"内部异常: {domainEx.InnerException.Message}");
                    sb.AppendLine();
                    sb.Append($"内部异常: {domainEx.InnerException.StackTrace}");
                }

                message = sb.ToString();
                return true;
            }

            return false;
        }

        /// <summary>
        /// 根据领域错误类型获取对应的前缀描述
        /// </summary>
        private string GetErrorTypePrefix(DomainErrorType errorType)
        {
            return errorType switch
            {
                DomainErrorType.Validation => "验证错误: ",
                DomainErrorType.Conflict => "状态冲突: ",
                DomainErrorType.NotFound => "资源未找到: ",
                DomainErrorType.LimitExceeded => "超出业务限制: ",
                _ => "领域错误: "
            };
        }
    }
}